import { strict as assert } from 'node:assert';
import { By, until } from 'selenium-webdriver';
import { describe, it, before, after } from 'mocha';
import { createDriver, BASE_URL, ensureServerUp } from './setup.mjs';
import { login } from './common.mjs';

describe('文件管理页面 E2E', function () {
  this.timeout(60000);
  let driver;

  before(async function () {
    // 确保前端服务已启动（避免 60s 超时）
    await ensureServerUp(60000);
    driver = await createDriver();
    await driver.manage().setTimeouts({
      implicit: 0,
      pageLoad: 60000,
      script: 30000
    });
    
    // 先登录
    await login(driver);
  });

  after(async function () {
    if (driver) {
      await driver.quit();
    }
  });

  it('应加载文件管理页面并展示标题', async function () {
    await driver.get(`${BASE_URL}/file-manage`);

    const title = await driver.wait(
      until.elementLocated(By.xpath("//h2[contains(., '文件管理')]")),
      15000,
      '未找到页面标题'
    );

    assert.ok(await title.isDisplayed(), '文件管理标题应显示');
  });

  it('应展示上传文件按钮', async function () {
    // 确保在文件管理页面
    await driver.get(`${BASE_URL}/file-manage`);
    
    const uploadBtn = await driver.wait(
      until.elementLocated(By.xpath("//button[contains(., '上传文件')]")),
      10000,
      '未找到上传文件按钮'
    );

    assert.ok(await uploadBtn.isDisplayed(), '上传文件按钮应可见');
  });

  it('应支持切换文件分类到"视频"', async function () {
    // 确保在文件管理页面
    await driver.get(`${BASE_URL}/file-manage`);
    
    const videoTab = await driver.wait(
      until.elementLocated(By.xpath("//button[contains(., '视频')]")),
      10000,
      '未找到视频分类按钮'
    );

    await videoTab.click();

    const className = await videoTab.getAttribute('class');
    assert.ok(className.includes('bg-blue-500'), '视频分类按钮点击后应变为激活状态');
  });

  it('应在切换视图模式时更新按钮状态', async function () {
    // 确保在文件管理页面
    await driver.get(`${BASE_URL}/file-manage`);
    
    const listButton = await driver.wait(
      until.elementLocated(By.xpath("//button[contains(., '列表')]")),
      10000,
      '未找到列表视图按钮'
    );
    const gridButton = await driver.wait(
      until.elementLocated(By.xpath("//button[contains(., '网格')]")),
      10000,
      '未找到网格视图按钮'
    );

    // 点击列表按钮
    await listButton.click();
    // 等待状态更新（React 重新渲染）
    await driver.sleep(500);
    // 等待列表按钮变为激活状态
    await driver.wait(async () => {
      const className = await listButton.getAttribute('class');
      return className.includes('bg-blue-500');
    }, 5000, '列表视图按钮未变为激活状态');
    let className = await listButton.getAttribute('class');
    assert.ok(className.includes('bg-blue-500'), '列表视图按钮被点击后应处于激活状态');

    // 点击网格按钮
    await gridButton.click();
    // 等待状态更新
    await driver.sleep(500);
    // 等待网格按钮变为激活状态
    await driver.wait(async () => {
      const className = await gridButton.getAttribute('class');
      return className.includes('bg-blue-500');
    }, 5000, '网格视图按钮未变为激活状态');
    className = await gridButton.getAttribute('class');
    assert.ok(className.includes('bg-blue-500'), '网格视图按钮被点击后应处于激活状态');
  });
});

